﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
   public class GestorArea
    {

       public static Area Obtener(int OID)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "AREAS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", OID);
               DataTable dt = repo.ExecuteDataTable();
               Area result = dt.ToGenericList<Area>(AreasConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new AreaGetException(ex);
           }
       }


       public static void Guardar(Area areas)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
               repo.Nombre = "AREAS_PROC";
               repo.AddParameter("@ACCION", areas.Persistencia);
               repo.AddParameter("@ID", areas.OID);
               repo.AddParameter("@CODIGO", areas.Codigo);
               repo.AddParameter("@DESCRIPCION", areas.Descripcion);
               repo.AddParameter("@IDAREASUPERIOR", areas.IdAreaSuperior);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               areas.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

               GestorBitacora.Guardar(areas);
           }
           catch (Exception ex)
           {
               throw new AreaSaveException(ex);
           }
       }


       public static void Eliminar(Area area)
       {
           area.Persistencia = EstadoPersistencia.DELETE;
           Guardar(area);
           area.Persistencia = EstadoPersistencia.UPDATE;
           area.Activo = false;
       }
       public static void ReActivar(Area area)
       {
           area.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(area);
           area.Persistencia = EstadoPersistencia.UPDATE;
           area.Activo = true;
       }


       public static List<Area> Consultar(string codigo, string descripcion,int? IdAreaSuperior ,bool? activo)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "AREAS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@CODIGO", codigo);
               repo.AddParameter("@DESCRIPCION", descripcion);
               repo.AddParameter("@IDAREASUPERIOR", IdAreaSuperior);
               repo.AddParameter("@ACTIVO", activo);
               DataTable dt = repo.ExecuteDataTable();
               List<Area> result = dt.ToGenericList<Area>(AreasConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new AreaGetException(ex);
           }
       }

       /// <summary>
       /// Permite consultar los todas las areas 
       /// </summary>
       /// <returns>Todos las Areas</returns>
       public static List<Area> Consultar()
       {
           return Consultar(null, null, null,null);
       }

       public static List<Area> Consultar(string codigo, string descripcion,int idAreasuperior)
       {
           return Consultar(codigo, descripcion,idAreasuperior, true);
       }

       
       #region Converter
       public static Area AreasConverter(DataRow row)
       {
           return new Area
           {
               OID = row["areaID"].ToInteger(),
               Codigo = row["areaCODIGO"].ToString(),
               Descripcion = row["areaDESCRIPCION"].ToString() ,
               IdAreaSuperior = row["areaIDAREASUPERIOR"].ToInteger(),
               AreaSuperior = row["AreaSuperior"].ToString(),
               Persistencia = EstadoPersistencia.UPDATE,
               Activo = row.IsNull("FECHA_BAJA") ? true : false
           };
       }    
       #endregion



    }
}
